A data processor may be configured to maintain a call stack in dependence on the data processing instructions it executes, in particular where the data processor pushes a return address onto the call stack when a function call is encountered, and to pop that return address from the call stack when the function ends. In a contemporary data processing apparatus it is common for more than one data processor (e.g. processor core) to be provided due to the performance enhancement that this brings. However, certain constraints with regard to the data processing carried out by these multiple processors must then be respected, to ensure that the results of the data processing performed by the multiple processors are predictable and determinate. One such example of this concerns transactional execution by a data processor, when accessing a data structure (e.g. stored in system memory) wherein that data structure is shared with at least one other data processor in the system. The sharing of this data structure means that certain protocols must be followed in order to avoid data hazards due to different data processors making concurrent modifications to the shared data structure. Each data processor in the data processing apparatus may then be configured, when operating in a transactional execution mode (i.e. during a period when access to a shared data structure is being attempted, but has not yet successfully completed) to update the call stack in a speculative manner, so that if the transactional execution with respect to the shared data structure does not successfully complete, then the data processor can discard the speculative modifications and “roll back” to the last known non-speculative point in the data processing sequence.